// #include "SubsystemAnimalEntitiesBase.h"
// #include "Subsystems/SubsystemTimeOfDay.h"
// #include "Terrain/Terrain.h"
// #include "Terrain/TerrainChunk.h"
// #include "GameThreadPool.hpp"
// #include "GameSingleton.h"
// #include "Components/ComponentBody.h"
// #include "Game/EntityData.hpp"
// #include "GameRegistry.hpp"
// #include "Managers/GameManager.h"
// #include "Managers/EntityManager.h"
// #include "Log.h"

// namespace PocketSurvival
// {
//     void SubsystemAnimalEntitiesBase::onTerrainChunkAdded(TerrainChunk *terrainChunk)
//     {
//         m_chunSetkMutex.lock();
//         // 添加生成的区块记录
//         m_chunkCoordsSet.insert(terrainChunk->coords);
//         // 查找动物记录
//         auto it = m_chunkAnimalsMap.find(terrainChunk->coords);
//         if (it != m_chunkAnimalsMap.end())
//         {
//             // 添加动物
//             for (AnimalEntityData *animalEntityDataPtr : it->second)
//             {
//                 m_addAnimalQueue.enqueue(animalEntityDataPtr);
//             }
//             // 清理动物记录
//             // it->second.clear();
//             m_chunkAnimalsMap.erase(it);
//         }
//         m_chunSetkMutex.unlock();
//     }

//     void SubsystemAnimalEntitiesBase::onTerrainChunkRemoved(TerrainChunk *terrainChunk)
//     {
//         std::vector<AnimalEntityData*> animalEntityDataPtrVec;
//         animalMutex.lock();
//         for (entt::entity entity : m_animalEntitiesSet)
//         {
//             ComponentBody *body = GameSingleton::gameRegistry->get<ComponentBody*>(entity);
//             EntityData *entityData = GameSingleton::gameRegistry->get<EntityData*>(entity);

//             AnimalEntityData *animalEntityDataPtr = new AnimalEntityData;
//             animalEntityDataPtr->entityName = entityData->ObjectName;
//             animalEntityDataPtr->position = body->position;

//             animalEntityDataPtrVec.push_back(animalEntityDataPtr);
//             m_removeAnimalQueue.enqueue(entity);
//         }
//         animalMutex.unlock();


//         m_chunSetkMutex.lock();

//         auto setIt = m_chunkCoordsSet.find(terrainChunk->coords);
//         if (setIt != m_chunkCoordsSet.end())
//         {
//             m_chunkCoordsSet.erase(setIt);
//         }
//         m_chunkAnimalsMap[terrainChunk->coords] = animalEntityDataPtrVec;

//         m_chunSetkMutex.unlock();
//     }

//     void SubsystemAnimalEntitiesBase::internalSaveNew()
//     {
//         // Log::Info("开始保存数据");

//         nlohmann::json saveJson = nlohmann::json::object();
//         m_chunSetkMutex.lock();
//         for (auto it = m_chunkAnimalsMap.begin(); it != m_chunkAnimalsMap.end(); ++it)
//         {
//             auto jsonIt = saveJson.find(it->first.toString());
//             if (jsonIt == saveJson.end())
//             {
//                 saveJson[it->first.toString()] = nlohmann::json::array();
//                 jsonIt = saveJson.find(it->first.toString());
//             }

//             for (const AnimalEntityData *animalEntityDataPtr : it->second)
//             {
//                 jsonIt.value().push_back({
//                     { "Name", animalEntityDataPtr->entityName },
//                     { "Position", animalEntityDataPtr->position }
//                 });
//             }
//         }
//         m_chunSetkMutex.unlock();


//         animalMutex.lock();
//         for (entt::entity entity : m_animalEntitiesSet)
//         {
//             ComponentBody *body = GameSingleton::gameRegistry->get<ComponentBody*>(entity);
//             EntityData *entityData = GameSingleton::gameRegistry->get<EntityData*>(entity);

//             Point3 point = body->position.toPoint3();
//             Point2 coords { point.posX >> 4, point.posZ >> 4 };

//             // Log::Info(fmt::format("保存entity: {}, position: {}", entityData->ObjectName, body->position.toString()));

//             saveJson[coords.toString()].push_back({
//                 { "Name",    entityData->ObjectName },
//                 { "Position",body->position         }
//             });
//         }
//         animalMutex.unlock();

//         std::string animalEntitiesFile = fmt::format("{}/AnimalEntities.json", GameSingleton::gameManager->getNowWorldPath());
//         if(Utils::SaveTextFile(animalEntitiesFile, saveJson.dump()) == false)
//         {
//             // throw std::runtime_error(fmt::format("无法保存方块实体数据到文件: {}", animalEntitiesFile)); 
//             Log::Error(fmt::format("无法保存方块实体数据到文件: {}", animalEntitiesFile));
//         }
//     }

//     void SubsystemAnimalEntitiesBase::update(float dt)
//     {
//         SubsystemAnimalEntities::update(dt);
//         if (m_subsystemTimeOfDay->periodicGameTimeEvent(5.0, 0.0))
//         {
//             GameSingleton::gameThreadPool->push_task([this]{
//                 animalMutex.lock();
//                 for (entt::entity entity : m_animalEntitiesSet)
//                 {
//                     ComponentBody *body = GameSingleton::gameRegistry->get<ComponentBody*>(entity);
//                     Point3 point = body->position.toPoint3();
//                     Point2 coords { point.posX >> 4, point.posZ >> 4};

//                     m_chunSetkMutex.lock();
//                     if (m_chunkCoordsSet.find(coords) == m_chunkCoordsSet.end())
//                     {
//                         m_removeAnimalQueue.enqueue(entity);
//                     }
//                     m_chunSetkMutex.unlock();

//                 }
//                 animalMutex.unlock();
//             });
//         }
//     }

//     void SubsystemAnimalEntitiesBase::load(const nlohmann::json &json)
//     {
//         m_subsystemTimeOfDay = GameSingleton::singletonPtr->getSingleton<SubsystemTimeOfDay>();

//         std::string jsonText;
//         if(Utils::LoadTextFile(fmt::format("{}/AnimalEntities.json", GameSingleton::gameManager->getNowWorldPath()), jsonText) == true)
//         {
//             nlohmann::json animalEntitiesJson = nlohmann::json::parse(jsonText);

//             for(const auto &jsonItem : animalEntitiesJson.items())
//             {
//                 std::vector<std::string> coordsData;
//                 Utils::StringSplit(jsonItem.key(), ",", coordsData);

//                 Point2 coords;
//                 coords.posX = std::stoi(coordsData[0]);
//                 coords.posY = std::stoi(coordsData[1]);

//                 std::vector<AnimalEntityData*> animalEntityDataPtrVec;

//                 for (const nlohmann::json &animalJson : jsonItem.value())
//                 {
//                     AnimalEntityData *animalEntityDataPtr = new AnimalEntityData;
//                     animalEntityDataPtr->entityName = animalJson["Name"].get<std::string>();
//                     animalEntityDataPtr->position = animalJson["Position"].get<Vector3>();
//                     animalEntityDataPtrVec.push_back(animalEntityDataPtr);
//                 }
//                 m_chunkAnimalsMap[coords] = animalEntityDataPtrVec;
//             }
//         }
//     }

//     void SubsystemAnimalEntitiesBase::save(nlohmann::json &json)
//     {
//         // 交由线程池进行保存处理
//         GameSingleton::gameSaveThreadPool->push_task(std::bind(&SubsystemAnimalEntitiesBase::internalSaveNew, this));
//     }
// }